package com.aopStudy.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/*
环绕增强类，添加环绕事务
 */
@Component
@Aspect
@Order(10)
public class TxAroundAdvice {

    /*
    环绕通知，需要你在通知中，定义目标方法的执行
    参数ProceedingJoinPoint joinPoint，作用：不仅可以获取目标方法的信息，还多了一个执行方法proceed()
    return 目标方法的返回值
     */
    @Around("com.aopStudy.pointcut.MyPointcut.myPointCut().myPointcut()")
    public Object transation(ProceedingJoinPoint joinPoint){
        // 保证目标方法被执行
        Object[] args = joinPoint.getArgs();
        Object result = null;
        try {
            // @before
            System.out.println("开启事务（环绕）");
            result = joinPoint.proceed(args);
            // @AfterReturn
            System.out.println("事务提交，返回值：" + result +  "（环绕）");
        } catch (Throwable e) {
            System.out.println("事务回滚" + e + "（环绕）");
            throw new RuntimeException(e);
        } finally {

        }

        return result;
    }

}
